package dados;

import java.sql.SQLException;

import org.hibernate.Query;
import org.hibernate.Session;

import utils.FabricaSessaoHibernate;
import entidades.Funcionario;

public class RepositorioFuncionarioHibernate {

	public void atualizar(Funcionario funcionario) throws SQLException,
			ClassNotFoundException, Exception {
		if (existe(funcionario.getId()) == true) {
			Session sessao = FabricaSessaoHibernate.ObterInstancia()
					.getSessionFactory().openSession();
			sessao.saveOrUpdate(funcionario);
			sessao.beginTransaction();
			sessao.getTransaction().commit();
			sessao.close();
		} else {
			throw new Exception("Funcionario inexistente!");
		}
	}

	public boolean existe(int id) throws SQLException, ClassNotFoundException {
		boolean existe;
		Session sessao = FabricaSessaoHibernate.ObterInstancia()
				.getSessionFactory().openSession();
		Funcionario funcionario = (Funcionario) sessao.get(Funcionario.class,
				id);

		existe = (funcionario != null);

		return existe;
	}

	public void inserir(Funcionario funcionario) throws SQLException,
			ClassNotFoundException, Exception {

		Session sessao = FabricaSessaoHibernate.ObterInstancia()
				.getSessionFactory().openSession();
		sessao.saveOrUpdate(funcionario);
		sessao.beginTransaction();
		sessao.getTransaction().commit();
		sessao.close();

	}

	public Funcionario procurar(int id) throws SQLException,
			ClassNotFoundException, Exception {
		Funcionario funcionario = null;

		if (existe(id)) {
			Session sessao = FabricaSessaoHibernate.ObterInstancia()
					.getSessionFactory().openSession();
			funcionario = (Funcionario) sessao.get(Funcionario.class, id);
			sessao.close();
		} else {
			throw new Exception("Funcionario inexistente!");
		}

		return funcionario;
	}

	public void remover(int id) throws SQLException, ClassNotFoundException,
			Exception {
		if (existe(id)) {
			Funcionario funcionario = procurar(id);
			Session sessao = FabricaSessaoHibernate.ObterInstancia()
					.getSessionFactory().openSession();
			sessao = FabricaSessaoHibernate.ObterInstancia()
					.getSessionFactory().openSession();
			sessao.delete(funcionario);
			sessao.beginTransaction();
			sessao.getTransaction().commit();
			sessao.close();
		} else {
			throw new Exception("Funcionario Inexistente!");
		}
	}

	public Funcionario procurarPorLogin(String login) throws Exception {
		Funcionario funcionario = null;

		Session sessao = FabricaSessaoHibernate.ObterInstancia()
				.getSessionFactory().openSession();
		Query query = sessao
				.createQuery("from Funcionario funcionario where funcionario.login='"
						+ login + "'");
		// query.setProperties(login);

		funcionario = (Funcionario) query.uniqueResult();
		sessao.close();
		if (funcionario == null) {
			throw new Exception("Funcionario inexistente!");
		}

		return funcionario;
	}
}